package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.entity.OrderProductDO;
import com.ssy.lingxi.order.model.bo.*;
import com.ssy.lingxi.order.model.dto.OrderGiveCouponDTO;
import com.ssy.lingxi.order.model.dto.OrderSeparateDTO;
import com.ssy.lingxi.order.model.dto.SupplyProductDTO;
import com.ssy.lingxi.order.model.vo.basic.request.*;
import com.ssy.lingxi.order.model.vo.mobile.request.BuyerOrderVO;
import com.ssy.lingxi.order.model.vo.vendor.request.AgentPurchaseOrderVO;
import com.ssy.lingxi.order.model.vo.vendor.request.VendorDeliveryVO;
import com.ssy.lingxi.order.model.vo.vendor.request.VendorUpdateProductPriceVO;
import com.ssy.lingxi.order.model.vo.vendor.response.VendorDeliveryProductVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单商品相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-18
 */
public interface IBaseOrderProductService {
    /**
     * 批量查询订单商品列表
     * @param orders 订单列表
     * @return 订单商品列表
     */
    List<OrderProductDO> findByOrderIn(List<OrderDO> orders);

    /**
     * 校验商品价格、运费
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param memberType 登录用户的会员类型，以此判断采购商品是会员商品，还是渠道商品
     * @param shopId  前端商城Id
     * @param freight 前端传递的运费
     * @param vendorProductMap 供应商及其商品列表
     * @return 订单运费
     */
    Wrapper<BigDecimal> checkOrderProductPrices(Long buyerMemberId, Long buyerRoleId, Integer memberType, Long shopId, BigDecimal freight, Map<VendorBO, List<OrderProductVO>> vendorProductMap);

    /**
     * App - （商品、会员、物流、营销服务）查询商品详情、折扣、物流、促销活动等信息
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberLevelType 采购会员（当前登录用户）等级类型
     * @param orderVO 订单接口参数
     * @param vendorCount 供应商数量
     * @param processPayment 交易流程是否需要支付
     * @param firstPayRate  交易流程中第一批次中最小支付次数的支付比例
     * @return 单个商品的优惠券减少金额
     */
    Wrapper<BuyerOrderCheckBO> checkMobileOrderProductPrices(Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, BuyerOrderVO orderVO, int vendorCount, boolean processPayment, BigDecimal firstPayRate);

    /**
     *（商品、会员、物流、营销服务）查询商品详情、折扣、物流、促销活动等信息
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberLevelType 采购会员（当前登录用户）等级类型
     * @param orderVO 订单接口参数
     * @param vendorCount 供应商数量
     * @param processPayment 交易流程是否需要支付
     * @param firstPayRate  交易流程中第一批次中最小支付次数的支付比例
     * @return 单个商品的优惠券减少金额
     */
    Wrapper<BuyerOrderCheckBO> checkAgentPurchaseOrderProduct(Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, AgentPurchaseOrderVO orderVO, int vendorCount, boolean processPayment, BigDecimal firstPayRate);

    /**
     * App - 拼团订单 - 查询商品详情、折扣、物流、促销活动等信息
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberLevelType 采购会员（当前登录用户）等级类型
     * @param orderVO 订单接口参数
     * @param processPayment 交易流程是否需要支付
     * @param firstPayRate  交易流程中第一批次中最小支付次数的支付比例
     * @return 拼团Id
     */
    Wrapper<Long> checkMobileGroupOrderProductPrices(Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, BuyerOrderVO orderVO, boolean processPayment, BigDecimal firstPayRate);

    /**
     * （拆单）加权平均拆单前订单的运费
     * @param orderFreight 接口参数中的运费，即拆单前的订单运费
     * @param consigneeVO  接口参数中的收货人信息
     * @param vendorMap    拆单条件
     * @return 查询结果
     */
    Map<OrderSeparateDTO, BigDecimal> findSeparateOrderFreight(BigDecimal orderFreight, OrderConsigneeVO consigneeVO, Map<OrderSeparateDTO, BigDecimal> vendorMap);

    /**
     * （拆单）加权平均拆单前订单的运费
     * @param orderFreight 接口参数中的运费，即拆单前的订单运费
     * @param vendorMap    拆单条件
     * @return 查询结果
     */
    Map<OrderSeparateDTO, BigDecimal> findSeparateOrderFreight(BigDecimal orderFreight, Map<OrderSeparateDTO, BigDecimal> vendorMap);

    /**
     * （B2B订单）校验询价商品价格
     * @param quoteNo 询价单号
     * @param products 订单商品列表
     * @return 校验结果
     */
    Wrapper<Void> checkBusinessOrderProductPrices(String quoteNo, List<BusinessOrderProductVO> products);

    /**
     * 校验现货采购订单商品价格
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param memberType 登录用户的会员类型，以此判断采购商品是会员商品，还是渠道商品
     * @param shopId  前端商城Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId 供应会员角色Id
     * @param products 订单商品信息列表
     * @return 订单商品总价
     */
    Wrapper<BigDecimal> checkPurchaseOrderProductPrices(Long buyerMemberId, Long buyerRoleId, Integer memberType, Long shopId, Long vendorMemberId, Long vendorRoleId, List<PurchaseOrderProductVO> products);

    /**
     * （物流服务）查询现货采购订单运费
     * @param consigneeVO 收货人信息
     * @param products 现货订单商品列表
     * @return 运费
     */
    Wrapper<BigDecimal> findPurchaseOrderFreight(BuyerOrderConsigneeVO consigneeVO, List<PurchaseOrderProductVO> products);

    /**
     * 校验采购订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @param isCreate 新增订单-true, 修改订单-false
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> checkBuyerOrderProduct(OrderDO order, List<OrderProductVO> products, boolean isCreate);

    /**
     * 校验积分兑换订单商品
     * @param order    订单
     * @param orderProductVO  积分兑换商品
     * @return 订单总积分
     */
    Wrapper<OrderProductCheckBO> checkPointsOrderProduct(OrderDO order, PointsOrderProductVO orderProductVO);

    /**
     * 校验B2B订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @param isCreate 新增订单-true, 修改订单-false
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> checkBusinessOrderProduct(OrderDO order, List<BusinessOrderProductVO> products, boolean isCreate);

    /**
     * 校验B2B订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @param isCreate 新增订单-true, 修改订单-false
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> checkPurchaseOrderProduct(OrderDO order, List<PurchaseOrderProductVO> products, boolean isCreate);

    /**
     * 校验、保存App订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @param platformCouponMap 商品SkuId使用“平台优惠券”的优惠金额
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> checkMobileOrderProduct(OrderDO order, List<MobileOrderProductVO> products, Map<Long, BigDecimal> platformCouponMap);

    /**
     * 校验、保存App 拼团订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> checkMobileGroupOrderProduct(OrderDO order, List<MobileOrderProductVO> products);

    /**
     * 校验Srm订单商品
     * @param order    订单
     * @param products 订单物料列表
     * @param isCreate 新增订单-true, 修改订单-false
     * @return 订单总金融
     */
    Wrapper<OrderProductCheckBO> checkSrmOrderProduct(OrderDO order, List<SrmOrderProductVO> products, boolean isCreate);

    /**
     * （供应商）修改订单商品单价
     * @param order  订单
     * @param prices 接口参数
     * @return 修改结果
     */
    Wrapper<UpdateOrderProductPriceBO> vendorUpdateProductPrices(OrderDO order, List<VendorUpdateProductPriceVO> prices);

    /**
     * 转单 - 订单商品
     * @param order    转单后的订单
     * @param separateOrderProducts 原订单商品列表
     * @param supplyProducts 上游供应商商品列表
     * @return 订单总金额，是否需要物流
     */
    Wrapper<OrderProductCheckBO> transferOrderProduct(OrderDO order, List<OrderProductDO> separateOrderProducts, List<SupplyProductDTO> supplyProducts);

    /**
     * 订单商品汇总信息
     * @param order 订单
     * @return 订单商品汇总
     */
    OrderProductSummaryBO summaryOrderProducts(OrderDO order);

    /**
     * 查询供应订单待发货商品信息
     * @param order 订单
     * @return 订单商品
     */
    List<VendorDeliveryProductVO> listVendorDeliveryProducts(OrderDO order);

    /**
     * 修改订单商品的已支付金额
     * @param order 订单
     * @param payAmount 单次支付金额
     * @return 修改结果
     */
    Wrapper<Void> updateProductPayAmount(OrderDO order, BigDecimal payAmount);

    /**
     * （转单）根据订单中的上游供应商与供应商商品，查询上游供应商商品信息
     * @param roleId 当前供应商要转单的服务消费者角色Id
     * @param orders 订单列表
     * @param orderProducts 订单商品列表
     * @return 上游供应商商品列表
     */
    Wrapper<List<SupplyProductDTO>> findSupplyProducts(Long roleId, List<OrderDO> orders, List<OrderProductDO> orderProducts);

    /**
     * （转单）检查订单发货条件，如果是转单订单发货，返回原订单及原订单的发货参数
     * @param order      发货的订单
     * @param deliveryVO 发货接口参数
     * @return 检查结果
     */
    Wrapper<TransferOrderDeliveryBO> checkOrderDelivery(OrderDO order, VendorDeliveryVO deliveryVO);

    /**
     * （转单）检查订单收货条件，如果有转单订单，返回转单订单
     * @param order 收货的订单
     * @return 检查结果
     */
    Wrapper<TransferOrderReceiveBO> checkOrderReceive(OrderDO order);

    /**
     * 保存赠送优惠券信息
     * @param order 订单
     * @param orderProductVOList 订单商品信息
     * @param giveCouponDTOMap 赠送的优惠券
     */
    void addGiveCouponList(OrderDO order, List<MobileOrderProductVO> orderProductVOList, Map<Long, List<OrderGiveCouponDTO>> giveCouponDTOMap);
}
